﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;

namespace BLL
{
    public class Departamento_BLL
    {
        #region singleton
        private static Departamento_BLL instance;

        private Departamento_BLL() { }

        public static Departamento_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Departamento_BLL();
                }
                return instance;
            }
        }
        #endregion

        public List<hrp_departamentos> obterDepartamentosEmpresa(int id_cliente, int id_empresa, bool apenasComCargos, bool apenasActivos)
        {


            hrpEntities hrp = new hrpEntities();
            var query = from dep in hrp.hrp_departamentos
                        join cargo in hrp.hrp_cargos on dep.id equals cargo.id_departamento into cargoView
                        from cargoDep in cargoView.DefaultIfEmpty()
                        where dep.id_cliente == id_cliente && dep.id_empresa == id_empresa
                            && (!apenasComCargos || (apenasComCargos && cargoDep != null))
                            && (!apenasActivos || (apenasActivos && dep.activo))
                        select dep;

            return query.GroupBy(d => d.id).Select(d => d.FirstOrDefault()).ToList();


        }

        public int criarDepartamento(int id_cliente, string userid, string ip,
                   int id_empresa, string departamento, string obs)
        {
            int result = 0;
            try
            {
                hrpEntities hrp = new hrpEntities();
                hrp_departamentos novoDepartamento = new hrp_departamentos();

                novoDepartamento.id_cliente = id_cliente;
                novoDepartamento.user_id = userid;
                novoDepartamento.user_timestamp = DateTime.Now;
                novoDepartamento.user_ip = ip;
                novoDepartamento.id_empresa = id_empresa;
                novoDepartamento.departamento = departamento;
                novoDepartamento.activo = true;
                novoDepartamento.observacao = obs;
                novoDepartamento.data_criacao = DateTime.Now;

                hrp.hrp_departamentos.Add(novoDepartamento);
                hrp.SaveChanges();
                result = novoDepartamento.id;

            }
            catch (Exception)
            {

                throw;
            }


            return result;
        }

        public bool VerificarDepartamentoExiste(string nomeDepartamento, int idempresa)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_departamentos.Any(d => d.id_empresa == idempresa && d.departamento == nomeDepartamento);
        }

        public hrp_departamentos ObterDepartamento(int id_cliente, int id_empresa,int dep_id)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_departamentos.FirstOrDefault(d => d.id_cliente==id_cliente && d.id_empresa==id_empresa && d.id == dep_id);
        }
        private void CriarLog(hrpEntities hrp, ref hrp_departamentos dep, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_departamentos_log depLog = new hrp_departamentos_log();
            depLog.activo = dep.activo;
            depLog.data_criacao = dep.data_criacao;
            depLog.departamento = dep.departamento;
            depLog.id = dep.id;
            depLog.id_cliente = dep.id_cliente;
            depLog.id_empresa = dep.id_empresa;
            depLog.log_user_id = userId;
            depLog.log_user_ip = userIp;
            depLog.log_user_timestamp = userTimestamp;
            depLog.observacao = dep.observacao;
            depLog.user_id = dep.user_id;
            depLog.user_ip = dep.user_ip;
            depLog.user_timestamp = dep.user_timestamp;
            hrp.hrp_departamentos_log.Add(depLog);
        }
        public void ActualizarDepartamento(int id_cliente, string userid, int id, string nome, string obs)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_departamentos dep = hrp.hrp_departamentos.FirstOrDefault(d => d.id == id);
            CriarLog(hrp,ref dep,userid,"",timestamp);

            dep.id_cliente = id_cliente;
            dep.user_id = userid;
            dep.departamento = nome;
            dep.observacao = obs;
            dep.user_timestamp = timestamp;
            hrp.SaveChanges();
        }

        public void AlterarEstado(int id_cliente, string userid, int id)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_departamentos dep = hrp.hrp_departamentos.FirstOrDefault(d => d.id == id);
            CriarLog(hrp, ref dep, userid, "", timestamp);
            dep.activo = !dep.activo;
            dep.user_id = userid;
            dep.user_timestamp = timestamp;
            hrp.SaveChanges();
        }

    }
}
